package componentes;

import java.awt.Color;
import java.util.Random;

import Calculos.VersorCalculable;
import Colisiones.Colisionador;

import com.uqbar.vainilla.DeltaState;
import com.uqbar.vainilla.appearances.Rectangle;
import com.uqbar.vainilla.colissions.CollisionDetector;
import com.uqbar.vainilla.events.constants.Key;

import estados.PaletaChicaState;
import estados.PaletaGrandeState;
import estados.PaletaNormalState;
import estados.PaletaState;

public class Paleta extends ComponenteGolpeable implements VersorCalculable{
	
	private Rectangle cuerpo;
	private double i;
	private double j;
	private double desplazamiento;
	private double velocidad = 100;
	private Color color;
	private int altoDeCuerpoNormal, anchoDeCuerpoNormal;
	private PaletaState estado;
	
	public Paleta(int x, int y) {
		this.color = Color.RED;
		this.altoDeCuerpoNormal = 5;
		this.anchoDeCuerpoNormal = 50;
		this.cuerpo = new Rectangle(this.color, this.anchoDeCuerpoNormal, this.altoDeCuerpoNormal);
		this.setX(x);
		this.setY(y);
		this.setAppearance(this.cuerpo);
		this.desplazamiento = 2;
		this.estado = new PaletaNormalState();

	}

	@Override
	public void onSceneActivated() {
		Random random = new Random();

		this.i = random.nextDouble() * 2 - 1;
		this.j = random.nextDouble() * 2 - 1;

		double m = Math.sqrt(this.i * this.i + this.j * this.j);

		this.i = this.i / m;
		this.j = this.j / m;

		super.onSceneActivated();
	}
	
	@Override
	public void update(DeltaState deltaState) {
		if(deltaState.isKeyBeingHold(Key.RIGHT)){
			this.movete(this.desplazamiento, deltaState);
		}
		if(deltaState.isKeyBeingHold(Key.LEFT)){
			this.movete(-this.desplazamiento, deltaState);
			}
		super.update(deltaState);
	}
	
	
	private void movete(double desplazamiento, DeltaState deltaState) {
		double advanced = this.velocidad * deltaState.getDelta();
		double siguientePosicion = this.getX() + desplazamiento;
		if(!(siguientePosicion + this.getAppearance().getWidth() > this.getGame().getDisplayWidth() || siguientePosicion < 0)){
			this.move(desplazamiento * advanced, 0);
		}
	}

	@Override
	public void teGolpeoBolita(Bolita unaBolita) {
		if(Colisionador.colisionaBolitaConComponente(unaBolita, this)){
			unaBolita.cambiaDireccionVertical();
		}
	}

	@Override
	public void setVersor(double x, double y) {
		this.i = x;
		this.j = y;
	}
	
	//////// ESTADOS //////////////
	
	

	public void cambiarDimensiones(int ancho, int alto){
		this.cuerpo = new Rectangle(this.color, ancho, alto);
		this.setAppearance(this.cuerpo);
	}
	
	public void volverANormalidad(){
		this.cambiarDimensiones(this.anchoDeCuerpoNormal, this.altoDeCuerpoNormal);
		this.cambiarEstado(new PaletaNormalState());
	}

	public void agrandate() {
		this.cambiarDimensiones(80, 5);
		this.cambiarEstado(new PaletaGrandeState());
	}
	
	public void achicate(){
		this.cambiarDimensiones(25, 5);
		this.cambiarEstado(new PaletaChicaState());
	}

	private void cambiarEstado(PaletaState paletaState) {
		this.estado = paletaState;
	}

	public void teEstanAgrandando() {
		this.estado.meAgrandaron(this);
		
	}

	public void teEstanAchicando() {
		this.estado.meAchicaron(this);
		
	}


}
